package com.hb.concert;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
// 1、在配置类的类级别上通过使用 @EnableAspectJAutoProxy 注解启用自动代理功能
// 2、如果不使用这个注解那么 Audience 只会是 Spring 容器中的一个 bean。即便使用了 AspectJ 注解，它也不会被视为切面，这些注解不会解析，也不会创建将其转换为切面的代理。
// 3、不管你是使用 JavaConfig 还是 XML，AspectJ 自动代理都会为使用 @Aspect 注解的 bean 创建一个代理，这个代理会围绕着所有该切面的切点所匹配的 bean。
// 在这种情况下，将会为 Concertbean 创建一个代理，Audience 类中的通知方法将会在 perform() 调用前后执行。我们需要记住的是，Spring 的 AspectJ 自动代理仅仅
// 使用 @AspectJ 作为创建切面的指导，切面依然是基于代理的。在本质上，它依然是 Spring 基于代理的切面。这一点非常重要，因为这意味着尽管使用的是 @AspectJ 注解，
// 但我们仍然限于代理方法的调用。如果想利用 AspectJ 的所有能力，我们必须在运行时使用 AspectJ 并且不依赖 Spring 来创建基于代理的切面。
@EnableAspectJAutoProxy(proxyTargetClass = false)
@ComponentScan(basePackages = "com.hb.concert")
public class ConcertConfig {
    @Bean
    public Audience audience() {
        return new Audience();
    }
}
